home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #1 / Ham Radio 2000.iso / ham2000 / tcp_ip / wnos / wn941101 / smisc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-10  |  4.3 KB  |  232 lines

  1. /* Miscellaneous servers */
  2.  
  3. #include <stdio.h>
  4. #include "global.h"
  5. #include "mbuf.h"
  6. #include "proc.h"
  7. #include "socket.h"
  8. #include "remote.h"
  9. #include "hardware.h"
  10. #include "commands.h"
  11. #include "smtp.h"
  12. #include "tcp.h"
  13.  
  14. char *Rempass = "";    /* Remote access password */
  15.  
  16. static int Sdisc = -1;
  17. static int Secho = -1;
  18. static int SRem  = -1;
  19.  
  20. static int near chkrpass __ARGS((struct mbuf *bp));
  21.  
  22. static void
  23. discserv(s,unused,p)
  24. int s;
  25. void *unused;
  26. void *p;
  27. {
  28.     struct mbuf *bp;
  29.  
  30.     sockowner(s,Curproc);
  31.     log(s,"DISC open");
  32.     while(recv_mbuf(s,&bp,0,NULLCHAR,NULL) > 0)
  33.         free_p(bp);
  34.     log(s,"DISC close");
  35.     close_s(s);
  36. }
  37.  
  38. static void
  39. echoserv(s,unused,p)
  40. int s;
  41. void *unused;
  42. void *p;
  43. {
  44.     struct mbuf *bp;
  45.  
  46.     sockowner(s,Curproc);
  47.     log(s,"ECHO open");
  48.     while(recv_mbuf(s,&bp,0,NULLCHAR,NULL) > 0)
  49.         send_mbuf(s,bp,0,NULLCHAR,0);
  50.  
  51.     log(s,"ECHO close");
  52.     close_s(s);
  53. }
  54.  
  55. /* Start up TCP discard server */
  56. int
  57. dis1(argc,argv,p)
  58. int argc;
  59. char *argv[];
  60. void *p;
  61. {
  62.     struct sockaddr_in lsocket;
  63.     int s;
  64.  
  65.     if(Sdisc != -1)
  66.         return 0;
  67.  
  68.     psignal(Curproc,0);     /* Don't keep the parser waiting */
  69.     chname(Curproc,"Discard listener");
  70.  
  71.     lsocket.sin_family = AF_INET;
  72.     lsocket.sin_addr.s_addr = INADDR_ANY;
  73.     lsocket.sin_port = (argc < 2) ? IPPORT_DISCARD : atoi(argv[1]);
  74.  
  75.     Sdisc = socket(AF_INET,SOCK_STREAM,0);
  76.     bind(Sdisc,(char *)&lsocket,sizeof(lsocket));
  77.     listen(Sdisc,1);
  78.     for(;;){
  79.         if((s = accept(Sdisc,NULLCHAR,(int *)NULL)) == -1)
  80.             break;    /* Service is shutting down */
  81.  
  82.         if(availmem() < Memthresh){
  83.             shutdown(s,1);
  84.         } else
  85.             /* Spawn a server */
  86.             newproc("Discard server",576,discserv,s,NULL,NULL,0);
  87.     }
  88.     return 0;
  89. }
  90.  
  91. /* Stop discard server */
  92. int
  93. dis0(argc,argv,p)
  94. int argc;
  95. char *argv[];
  96. void *p;
  97. {
  98.     close_s(Sdisc);
  99.     Sdisc = -1;
  100.     return 0;
  101. }
  102.  
  103. /* Start up TCP echo server */
  104. int
  105. echo1(argc,argv,p)
  106. int argc;
  107. char *argv[];
  108. void *p;
  109. {
  110.     struct sockaddr_in lsocket;
  111.     int s;
  112.  
  113.     if(Secho != -1){
  114.         return 0;
  115.     }
  116.     psignal(Curproc,0);     /* Don't keep the parser waiting */
  117.     chname(Curproc,"Echo listener");
  118.  
  119.     lsocket.sin_family = AF_INET;
  120.     lsocket.sin_addr.s_addr = INADDR_ANY;
  121.     lsocket.sin_port = (argc < 2) ? IPPORT_ECHO : atoi(argv[1]);
  122.  
  123.     Secho = socket(AF_INET,SOCK_STREAM,0);
  124.     bind(Secho,(char *)&lsocket,sizeof(lsocket));
  125.     listen(Secho,1);
  126.     for(;;){
  127.         if((s = accept(Secho,NULLCHAR,(int *)NULL)) == -1)
  128.             break;    /* Service is shutting down */
  129.  
  130.         if(availmem() < Memthresh){
  131.             shutdown(s,1);
  132.         } else
  133.             /* Spawn a server */
  134.             newproc("Echo server",576,echoserv,s,NULL,NULL,0);
  135.     }
  136.     return 0;
  137. }
  138.  
  139. /* stop echo server */
  140. int
  141. echo0(argc,argv,p)
  142. int argc;
  143. char *argv[];
  144. void *p;
  145. {
  146.     close_s(Secho);
  147.     Secho = -1;
  148.     return 0;
  149. }
  150.  
  151. /* Check remote password */
  152. static int near
  153. chkrpass(struct mbuf *bp)
  154. {
  155.     char lbuf[80];
  156.  
  157.     int16 len = len_p(bp);
  158.  
  159.     if(strlen(Rempass) != len)
  160.         return 0;
  161.     pullup(&bp,lbuf,(int16)min(len,80));
  162.     return (strncmp(Rempass,lbuf,len) == 0);
  163. }
  164.  
  165. /* Start remote exit/reboot server */
  166. int
  167. rem1(int argc,char *argv[],void *p)
  168. {
  169.     struct sockaddr_in lsocket,fsock;
  170.     int i, command;
  171.     struct mbuf *bp;
  172.     int32 addr;
  173.  
  174.     if(SRem != -1)
  175.         return 0;
  176.     psignal(Curproc,0);
  177.     chname(Curproc,"Remote listener");
  178.     lsocket.sin_family = AF_INET;
  179.     lsocket.sin_addr.s_addr = INADDR_ANY;
  180.     lsocket.sin_port = (argc < 2) ? IPPORT_REMOTE : atoi(argv[1]);
  181.  
  182.     SRem = socket(AF_INET,SOCK_DGRAM,0);
  183.     bind(SRem,(char *)&lsocket,sizeof(lsocket));
  184.     for(;;){
  185.         i = sizeof(fsock);
  186.         if(recv_mbuf(SRem,&bp,0,(char *)&fsock,&i) == -1)
  187.             break;
  188.         command = PULLCHAR(&bp);
  189.         i = chkrpass(bp);
  190.         switch(command){
  191. #ifdef    MSDOS    /* Only present on PCs running MSDOS */
  192.         case SYS_RESET:
  193.             log(SRem,"REM  reset %s %s",
  194.               psocket((struct sockaddr *)&fsock),i ? "" : "PASSWORD FAIL");
  195.             if(i){
  196.                 iostop();
  197.                 sysreset();    /* No return */
  198.             }
  199.             break;
  200. #endif
  201.         case SYS_EXIT:
  202.             log(SRem,"REM  exit %s %s",
  203.               psocket((struct sockaddr *)&fsock),i ? "" : "PASSWORD FAIL");
  204.             if(i){
  205.                 iostop();
  206.                 doexit(0,0,0);
  207.             }
  208.             break;
  209.         case KICK_ME:
  210.             if(len_p(bp) >= sizeof(int32))
  211.                 addr = pull32(&bp);
  212.             else
  213.                 addr = fsock.sin_addr.s_addr;
  214.             kick(addr);
  215.             smtptick((void *)addr);
  216.             break;
  217.         }
  218.         free_p(bp);
  219.     }
  220.     return 0;
  221. }
  222.  
  223. int
  224. rem0(int argc,char *argv[],void *p)
  225. {
  226.     close_s(SRem);
  227.     SRem = -1;
  228.     return 0;
  229. }
  230.  
  231.  
  232.